<!DOCTYPE html>

<!--
    This file is part of linux-intro-2013 presentation.

    Foobar is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    Foobar is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
-->

<!--
  Google HTML5 based slides

  Authors: Nikolay Orliuk (content, code, branding)
  Engine authors:
           Luke Mahé (code)
           Marcin Wichary (code and design)
           
           Dominic Mazzoni (browser compatibility)
           Charles Chen (ChromeVox support)

  URL: http://code.google.com/p/html5slides/
-->

<html>
  <head>
    <title>Presentation</title>

    <meta charset='utf-8'>
    <script
      src='http://html5slides.googlecode.com/svn/trunk/slides.js'></script>
    <link rel="stylesheet" type="text/css" href="console.css"/> 
    <link rel="stylesheet" type="text/css" href="layouts-ony.css"/> 
    <link rel="stylesheet" type="text/css" href="template-ony.css"/> 
    <link rel="stylesheet" type="text/css" href="template-luxoft.css"/> 
    <script lang='jscript'>
      var availLayouts = [
        'layout-regular',
        'layout-widescreen',
        'layout-faux-widescreen',
        'layout-720p',
        'layout-1080p'
        ];
      var reLayout = /^layout-/;
      var currentLayout = 0;

      function nextLayout()
      {
        var presentations = document.querySelectorAll('section.slides');
        var foundLayout;
        for(var j = 0, presentation; presentation = presentations[j]; ++j)
        {
          // remove prev layouts
          for(var i = 0, item; item = presentation.classList[i];)
          {
            if (reLayout.test(item)) {
              foundLayout = foundLayout || item;
              presentation.classList.remove(item);
            }
            else ++i;
          }
          // detect current layout
          for(var i = 0, item; item = availLayouts[i]; ++i)
          {
            if (item !== foundLayout) continue;
            currentLayout = i;
            break;
          }
          // add new one
          currentLayout = (currentLayout + 1) % availLayouts.length;
          presentation.classList.add(availLayouts[currentLayout]);
        }
      }

      function skipSlide() {
        if (curSlide < slideEls.length - 1) {
          curSlide++;

          updateSlides();
        }
      };

      function autoBuildSlide() {
        while (buildNextItem());
      };

      function handleKeyDown(event)
      {
        switch(event.keyCode)
        {
        case 76: // "l" button
          event.preventDefault();
          nextLayout();
          break;

        case 78: // "n" button
          event.preventDefault();
          skipSlide();
          break;

        case 66: // "b" button
          event.preventDefault();
          autoBuildSlide();
          break;
        }
      }
      document.addEventListener('keydown', handleKeyDown, false);
    </script>
  </head>
  
  <style>
    /* Your individual styles here, or just use inline styles if that’s
       what you want. */

    li.plan-current {
      color: red;
    }

    .unshown {
      color: #d0d0d0;
      visibility: hidden;
    }

    .plan-current .unshown {
      visibility: visible;
    }
    
  </style>
  <body style='display: none'>

    <!-- consider: layout-720p and layout-1080p -->
    <!-- consider: template-default -->
    <section class='slides layout-default template-luxoft'>
      
      <article class='biglogo'><h1>Знакомство с<br/>ОС Linux</h1>
        <p>Nikolay Orliuk <br/> Sep 2013</p>
      </article>


      <article id='plan' class='plan'><h3> О чём мы говорим? </h3>
        <ol>
          <li/> Вступление <span class=unshown>0:01</span>
          <li/> Процессы <span class=unshown>0:05</span>
          <li/> Пользователи и права доступа <span class=unshown>0:25</span>
          <li/> Файловая система <span class=unshown>0:35 (перерыв?)</span>
          <li/> Устройства <span class=unshown>1:10</span>
          <li/> Ядро и загрузка системы <span class=unshown>1:25</span>
          <li/> Дистрибутивы <span class=unshown>1:45</span>
        </ol>
      </article>

      <article><h3>Почему я использую Линукс</h3>
        <!-- img
          src="http://upload.wikimedia.org/wikipedia/commons/0/0a/Tux-shaded.svg"
          style="float:right"
          -->
        <img
          src="images/Tux-shaded.svg"
          style="float:right"
          width="33%"
          height="33%"
          />
        <ul>
          <li/> Потому что когда-то с помощью маленького дистрибутива Pygmy
                я случайно перетёр свою винду а через несколько дней мне
                удалось найти лишь RedHat 7.2
          <li/> Мне нравится маскот в виде пингвина
        </ul>
        <span class="build">
          <ul>
            <li/> Свобода выбора (хранение информации, внешний вид, вендор)
            <li/> Потенциально полный контроль над системой
            <li/> Возможность исправить/изменить что-то самим
            <li/> Наличие разных централизованных систем управления
                  установленным ПО
          </ul>
        </span>
      </article>

      <article><h3>Основные компоненты и их взаимодействия</h3>
        <ul class="build">
          <li/> Приложения
          <li/> Файлы
          <li/> Ядро и устройства
        </ul>
      </article>


      <article class='plan'> </article>
      <article><h3>Процессы</h3>
        <ul class=build>
          <li/> Понятие дочерний-родительский процесс
          <li/> Потоки ввода, вывода и ошибок
          <li/> user id (uid), group id (gid)
        </ul>
      </article>

      <article><h3>Переменные окружения</h3>
<blockquote class="console"><span color=pink>zsh</span>% <span>env
TERM=rxvt-unicode-256color
HOME=/home/nikolay
SHELL=/bin/zsh
USER=nikolay
LOGNAME=nikolay
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl
SHLVL=1
PWD=/home/nikolay
OLDPWD=/home/nikolay
JAVA_HOME=/usr/lib/jvm/java-7-openjdk/jre
LANG=en_US.UTF-8
HG=/usr/bin/hg
EDITOR=vim
VISUAL=vim
SSH_ASKPASS=/usr/lib/ssh/x11-ssh-askpass
zsh%</span></blockquote>
        <ul>
          <li/> Процесс установки переменных окружения
          <li/> Использование (LANG, TZ, TERM, HOME, DISAPLAY, PATH и пр.)
        </ul>
      </article>

      <article><h3>Запуск программ</h3>
<blockquote class="console build">zsh% <span>ls /tmp
</span><span>index.html.swp
mc-nikolay
zsh% </span><span>/ls /tmp
</span><span>zsh: no such file or directory: /ls
zsh% </span><span>where ls
</span><span>/usr/bin/ls
zsh% </span><span>/bin/ls /tmp
</span><span>index.html.swp
mc-nikolay
zsh%</span></blockquote>
        <ul class=build>
          <li/> Переменная окружения PATH
        </ul>
      </article>

      <article><h3>Скрипты</h3>
        <pre class="prettyprint lang-bsh build">
#!/bin/bash
<span># lines that starts with slash (at least first one)
# should be ignored by interpreter

# Lets find all hidden files/folders
# that wasn't user for more that two weeks</span>
<span class=build>find ~ -maxdepth 1 -name '.*' \
    -daystart -atime +14 \
    -exec stat -c '<span>%X </span>%x %n' '{}' ';'<span> \
    | sort -rn -k 1
# sorted in a way so oldest is the first
</span></span></pre>
        <ul>
          <li/> she-bang
          <li/> comments
        </ul>
      </article>


      <article class='plan'> </article>
      <article><h3>Пользователи и группы</h3>
        <ol>
          <li/> С каждым аутентифицированным пользователем ассоциированна
                основная и дополнительные группы.
          <li/> С каждым процессом ассоциированы: пользователь, группа и маска
                прав для создаваемых объектов на файловой системе
          <li/> Специальный пользователь root (uid=0)
        </ol>
      </article>

      <article><h3>Аутентификация пользователя</h3>
        <ol>
          <li/> Что хранится в /etc/passwd ( /etc/shadow ) ?
          <li/> Процесс "входа" в систему под пользователем
        </ol>
      </article>


      <article class='plan'> </article>
      <article><h3>Представление</h3>
<!-- <blockquote class="console" style="float:right;width:12em;height:37em"><span style="color:pink">zsh</span>% tree -F  -->
<blockquote class="console" style="float:right;"><span style="color:pink">zsh</span>% tree -F
.
├── bin/
│   ├── bash*
│   └── sh -&gt; bash*
├── boot/
│   └── vmlinuz
├── dev/
│   ├── sda
│   ├── cdrom
│   ├── random
│   └── console
├── etc/
│   ├── opt/
│   └── sysconfig/
├── home/
├── lib/
├── media/
│   ├── cdrom/
│   └── floppy/
├── mnt/
├── root/
├── sbin/
├── tmp/
├── usr/
│   ├── bin/
│   ├── lib/
│   ├── sbin/
│   ├── share/
│   │   ├── doc/
│   │   ├── info/
│   │   ├── locale/
│   │   └── man/
│   └── src/
└── var/
    └── tmp/</blockquote>
        <ul class="build">
          <li/> Единое дерево файлов и каталогов
          <li/> Точки монтирования
          <li/> Права доступа
          <li/> Типы узлов (каталог, обычный файл и др)
        </ul>
      </article>

      <!-- <article><h3>Навигация</h3>
      </article> -->

      <article><h3>Точки монтирования</h3>
          <blockquote class="console build">zsh# mount
<span>proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime)
/dev/sda7 on / type btrfs (rw,noatime,noacl,space_cache)
/dev/sdf1 on /boot type ext2 (ro,noatime,errors=continue)
zsh# </span><span>ls -la /boot
</span><span>drwxr-xr-x 9 root    root         3072 Aug  8 00:33 .
drwxr-xr-x 1 root    root          482 Sep 14 19:43 ..
-rw-r--r-- 1 root    root      2212692 Aug  7 11:19 System.map
-rw-r--r-- 1 root    root       113248 Aug  7 11:19 config
-rw-r--r-- 1 root    root      3050464 Aug  7 11:19 vmlinuz
zsh# </span><span>umount /boot
</span><span>zsh# </span><span>ls -la /boot
</span><span>drwxr-xr-x 1 root root     304 Mar 22 23:56 .
drwxr-xr-x 1 root root     482 Sep 14 19:43 ..
zsh# </span><span>mount -t ext2 -o rw,noatime,nodiratime /dev/sdf1 /boot
</span><span>zsh# </span><span>ls -la /boot
</span><span>drwxr-xr-x 9 root    root         3072 Aug  8 00:33 .
drwxr-xr-x 1 root    root          482 Sep 14 19:43 ..
-rw-r--r-- 1 root    root      2212692 Aug  7 11:19 System.map
-rw-r--r-- 1 root    root       113248 Aug  7 11:19 config
-rw-r--r-- 1 root    root      3050464 Aug  7 11:19 vmlinuz
zsh# </span><span>mount | grep /boot
</span><span>/dev/sdf1 on /boot type ext2 (rw,noatime,nodiratime,errors=continue)
zsh# </span></blockquote>
        <ul>
          <li/> Что и куда монтируется
          <li/> Тип файловой системы
          <li/> Чтение-запись
          <li/> Дополнительные опции
        </ul>
      </article>

      <article><h3>Ссылки</h3>
        <ul>
          <li/>Жесткие (hard-link)
          <p> Ссылаются на содержимое </p>
          <li/>Символические (symbolic-link)
          <p> Ссылаются на путь в иерархии файлов и каталогов </p>
        </ul>
      </article>

      <article><h3>Организация ФС на диске</h3>
        <ul>
          <li/>fat32
          <li/>exfat
          <li/>ntfs
        </ul>
        <span class=build>
          <ul>
            <li/>ext2/3/4
            <li/>reiserfs
            <li/>btrfs
            <li/>nilfs
          </ul>
        </span>
      </article>

      <article><h3>Авторизация доступа</h3>
<blockquote class="console" style="float:right;"><span style="color:pink">zsh</span>% ls -lad /tmp $TTY =write =su
crw--w----  1 nikolay tty  136, 6 Sep 19  2013 /dev/pts/6
drwxrwxrwt 14 root    root    480 Sep 19 05:34 /tmp
-rwsr-xr-x  1 root    root  27496 Jul 31 16:15 /usr/bin/su
-rwxr-sr-x  1 root    tty   14856 Jul 31 16:15 /usr/bin/write
</blockquote>
        <ul>
          <li/> применение прав на файл
          <li/> бит траверсинга
          <li/> sticky бит
          <li/> suid/sgid биты
        </ul>
      </article>


      <article class='plan'> </article>
      <article><h3>Устройства как файлы</h3>
        <ul>
          <li/> Логическая платформо-независимая обобщенная адресация устройств
          <li/> Взаимодействие с системой стандартными средствами работы с
                файлами
          <li/> Использование существующего механизма управления доступом
          <li/> Возможность пере-адресации устройств без изменения приложений
        </ul>
      </article>

      <article><h3>Блочные устройства</h3>
        <ul>
          <li/> Представляют некий блок данных определенного конечного размера
          <li/> Произвольный доступ к любому участку данных
          <li/> Пример (sda1, vcs1)
        </ul>
      </article>

      <article><h3>Символьные устройства</h3>
        <ul>
          <li/> Представляют последовательность символов неопределенного размера
          <li/> Последовательный доступ к содержимому
          <li/> Пример (zero, null, urandom)
        </ul>
      </article>


      <article class='plan'> </article>
      <article><h3>Ядро линукса</h3>
        <ul>
          <li/> Платформа для приложений
          <li/> Управление процессами
          <li/> Драйвера предоставляющие связь между логическим устройством и
                физическим
          <li/> Файловые системы, сеть и прочее
          <li/> Запуск основного процесса (init)
        </ul>
      </article>

      <article><h3>Загружаемые модули ядра</h3>
        <ul>
          <li/> Небольшие кусочки ядра выделенные в отдельные файлы
          <li/> modprobe, insmod, rmmod
          <li/> modinfo
        </ul>
      </article>

      <article><h3>Загрузчик</h3>
        <ul>
          <li/> От BIOS к загрузчику (MBR и пр)
          <li/> Загрузчик и ядро
          <li/> Параметры ядра
          <li/> Что такое initramfs/initrd?
        </ul>
      </article>


      <article class='plan'> </article>
      <article><h3>Задачи дистрибутива</h3>
        <ul>
          <li/> Подготовка системы Линукс для конечного пользователя
          <li/> Управление необязательными пакетами дистрибутива
          <li/> Обобщение установленными приложениями и сервисами
          <li/> Сопровождение стека ПО
          <ul>
            <li/> Обновление
            <li/> Изменение состава (добавление новых, исключение неподдерживаемых)
            <li/> Внедрение (корректировка для конфигурирования в составе дистрибутива)
            <li/> Управление стабильностью
          </ul>
        </ul>
      </article>

      <article><h3>Менеджер пакетов</h3>
        <ul>
            <li/> Определение формата пакета
            <li/> Управление пакетами
            <li/> Доступ к репозиторию пакетов
            <li/> Конфигурирование
            <li/> Контроль и разрешение зависимостей
        </ul>
      </article>

      <article><h3>Чем отличаются дистрибутивы?</h3>
        <ul class=build>
            <li/> Способ установки системы (полу-автоматический или ручной)
            <li/> Способ установки пакета (бинарные файлы или описание процесса
                  сборки)
            <li/> Близость к апстриму (стабильные старые версии с ворохом
                  патчей или текущий срез репозитория исходников)
            <li/> Набор пакетов (ориентировка на игры, серверный и пр)
            <li/> Степень безопасности
            <li/> Целевая платформа (embedded или desktop/server)
            <li/> Контроль и разрешение зависимостей
        </ul>
      </article>


      <article><h2>Дополнительные вопросы</h2>
      </article>

    </section>

    <script lang='jscript'> // fill plan slides
      function makePlan()
      {
        var planSource = document.getElementById('plan').innerHTML;
        var planSlides = document.querySelectorAll('article.plan');
        // copy
        for (var i = 0, slide; slide = planSlides[i]; ++i) {
          slide.innerHTML = planSource;

          // mark
          var items = slide.querySelectorAll('li');
          //items[i].innerHTML = '&gt;' + items[i].innerHTML + '&lt;';
          items[i].classList.add('plan-current');
        }
      }
      makePlan();
    </script>

  </body>
</html>
<!-- ex:sw=2
  -->
